# -*- coding: utf-8 -*-
# @Author  : gaoyu
# @Time    : 2024/2/28 4:25 PM
# @Function:
import hashlib
import os
import re

from loguru import logger
import shutil
import zlib

from util.dir_util import get_upper_dir, mkdir


def get_file_extension(file_path):
    """
    取文件后缀名
    :param file_path:
    :return:
    """
    file_name, file_extension = os.path.splitext(file_path)
    return file_extension


def delete_file(filename):
    """
    删除文件
    :param filename: 文件
    :return:
    """
    if os.path.exists(filename):
        os.remove(filename)
        logger.info(f"文件 {filename} 删除成功！")
    else:
        logger.info(f"文件 {filename} 不存在。")


def get_file_md5(filename):
    """
    获取md5值
    :param filename:
    :return:
    """
    with open(filename, 'rb') as f:
        md5 = hashlib.md5()
        while True:
            data = f.read(4096)
            if not data:
                break
            md5.update(data)

    return md5.hexdigest()


def read_plain_file(file_path):
    """
    读文本文件
    :param file_path:
    :return:
    """
    with open(file_path, 'r', encoding='utf-8') as file:
        content = file.read()
        return content


def get_file_name_and_extension(file_path):
    """
    取文件名和后缀名
    :param file_path:
    :return:
    """
    return os.path.splitext(file_path)


def move_file(source_file, target_dir):
    """
    移动文件
    :param source_file: 源文件
    :param target_dir: 目标路径
    :return:
    """
    try:
        # 将源文件移动到目标文件夹
        shutil.move(source_file, target_dir)
    except FileNotFoundError:
        print("未找到指定的文件或目录。")
    except Exception as e:
        print("发生错误：", str(e))


def copy_file_to_dir(source_file, target_dir):
    """
    移动文件
    :param source_file: 源文件
    :param target_dir: 目标路径
    :return:
    """
    try:
        # 将源文件移动到目标文件夹
        shutil.copy(source_file, target_dir)
    except FileNotFoundError:
        print("未找到指定的文件或目录。")
    except Exception as e:
        print("发生错误：", str(e))


def copy_file(source_file, target_file):
    """
    移动文件
    :param source_file: 源文件
    :param target_file: 目标文件
    :return:
    """
    try:
        target_dir = get_upper_dir(target_file)
        mkdir(target_dir)
        # 将源文件移动到目标文件夹
        shutil.copy(source_file, target_dir)
    except FileNotFoundError:
        print("未找到指定的文件或目录。")
    except Exception as e:
        print("发生错误：", str(e))


def file_crc(filename):
    """
    计算文件的 CRC 校验码。
    :param filename: 文件路径
    :return: CRC 校验码
    """
    crc = 0
    with open(filename, 'rb') as f:
        # 读取文件内容并更新 CRC 值
        while buffer := f.read(4096):
            crc = zlib.crc32(buffer, crc)
    return crc & 0xffffffff  # CRC 校验码通常以无符号 32 位整数形式表示


def delete_similar_files(filename: str):
    delete_file(filename)
    # 获取当前目录
    directory = os.getcwd()

    # 提取文件的前缀部分（去掉后缀）
    base_name = filename[:-5]  # 去掉 ".f119" 或 ".f001" 后缀
    suffix = filename[-4:]  # 提取后缀部分，例如 .f119

    # 构建正则表达式，匹配相同前缀且后缀与指定文件相同的文件
    pattern = re.compile(rf"^{re.escape(base_name)}\.\d+\.{re.escape(suffix)}$")

    # 遍历当前目录下的所有文件
    for file in os.listdir(directory):
        file_path = os.path.join(directory, file)

        # 判断文件是否符合模式
        if os.path.isfile(file_path) and pattern.match(file):
            # 删除符合模式的文件
            os.remove(file_path)
            print(f"Deleted file: {file}")
